//go:build js || wasm

package godom

import "syscall/js"

// HTMLAnchorElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement
type HTMLAnchorElementWrapper interface {
	HTMLElementWrapper

	Download() js.Value
	Hash() js.Value
	Host() js.Value
	Hostname() js.Value
	Href() js.Value
	Hreflang() js.Value
	Origin() js.Value
	Password() js.Value
	Pathname() js.Value
	Ping() js.Value
	Port() js.Value
	Protocol() js.Value
	ReferrerPolicy() js.Value
	Rel() js.Value
	RelList() js.Value
	Search() js.Value
	Target() js.Value
	Text() js.Value
	Type() js.Value
	Username() js.Value

	ToString() js.Value
}

// HTMLAreaElementWrapper
// <area>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLAreaElement
type HTMLAreaElementWrapper interface {
	HTMLElementWrapper

	Hash() js.Value
	Host() js.Value
	Hostname() js.Value
	Href() js.Value
	Origin() js.Value
	Password() js.Value
	Pathname() js.Value
	Ping() js.Value
	Port() js.Value
	Protocol() js.Value
	ReferrerPolicy() js.Value
	Rel() js.Value
	RelList() js.Value
	Search() js.Value
	Target() js.Value
	Username() js.Value

	ToString() js.Value
}

// HTMLAudioElementWrapper
// <audio>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLAudioElement
type HTMLAudioElementWrapper interface {
	HTMLMediaElementWrapper
}

// HTMLBRElementWrapper
// <br>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLBRElement
type HTMLBRElementWrapper interface {
	HTMLElementWrapper
}

// HTMLBaseElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLBaseElement
type HTMLBaseElementWrapper interface {
	HTMLElementWrapper

	Target() js.Value
}

// HTMLBodyElementWrapper
// <body>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLBodyElement
type HTMLBodyElementWrapper interface {
	HTMLElementWrapper
}

// HTMLButtonElementWrapper
// <button>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLButtonElement
type HTMLButtonElementWrapper interface {
	HTMLElementWrapper

	Disabled() js.Value
	Labels() js.Value
	PopoverTargetAction() js.Value
	PopoverTargetElement() js.Value
	Type() js.Value
}

// HTMLCanvasElementWrapper
// <canvas>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement
type HTMLCanvasElementWrapper interface {
	HTMLElementWrapper

	Height() js.Value
	Width() js.Value

	CaptureStream() js.Value
	GetContext() js.Value
	ToBlob() js.Value
	ToDataURL() js.Value
	TransferControlToOffscreen() js.Value
}

// HTMLDListElementWrapper
// <dl>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLDListElement
type HTMLDListElementWrapper interface {
	HTMLElementWrapper
}

// HTMLDataElementWrapper
// <data>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLDataElement
type HTMLDataElementWrapper interface {
	HTMLElementWrapper

	Value() js.Value
}

// HTMLDataListElementWrapper
// <datalist>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLDataListElement
type HTMLDataListElementWrapper interface {
	HTMLElementWrapper
}

// HTMLDialogElementWrapper
// <dialog>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement
type HTMLDialogElementWrapper interface {
	HTMLElementWrapper

	Open() js.Value
	ReturnValue() js.Value

	Close() js.Value
	Show() js.Value
	ShowModal() js.Value
}

// HTMLDivElementWrapper
// <div>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLDivElement
type HTMLDivElementWrapper interface {
	HTMLElementWrapper
}

// HTMLDocumentWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLDocument
type HTMLDocumentWrapper interface {
	DocumentWrapper
}

// HTMLElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement
type HTMLElementWrapper interface {
	ElementWrapper

	AccessKey() js.Value
	AccessKeyLabel() js.Value
	AttributeStyleMap() js.Value
	Autocapitalize() js.Value
	Autofocus() js.Value
	ContentEditable() js.Value
	Dataset() js.Value
	Dir() js.Value
	Draggable() js.Value
	EnterKeyHint() js.Value
	Hidden() js.Value
	Inert() js.Value
	InnerText() js.Value
	InputMode() js.Value
	IsContentEditable() js.Value
	Lang() js.Value
	Nonce() js.Value
	OffsetHeight() js.Value
	OffsetLeft() js.Value
	OffsetParent() js.Value
	OffsetTop() js.Value
	OffsetWidth() js.Value
	OuterText() js.Value
	Popover() js.Value
	Spellcheck() js.Value
	Style() js.Value
	TabIndex() js.Value
	Title() js.Value
	Translate() js.Value

	AttachInternals()
	Blur()
	Click()
	Focus()
	HidePopover()
	ShowPopover()
	TogglePopover()
}

// HTMLEmbedElementWrapper
// <embed>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLEmbedElement
type HTMLEmbedElementWrapper interface {
	HTMLElementWrapper
}

// HTMLFieldSetElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLFieldSetElement
type HTMLFieldSetElementWrapper interface {
	HTMLElementWrapper

	Height() js.Value
	Src() js.Value
	Width() js.Value
}

// HTMLFormControlsCollectionWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormControlsCollection
type HTMLFormControlsCollectionWrapper interface {
	HTMLCollectionWrapper

	// NamedItem() js.Value //todo: перепроверить разницу
}

// HTMLFormElementWrapper
// <form>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement
type HTMLFormElementWrapper interface {
	HTMLElementWrapper

	AcceptCharset() js.Value
	Action() js.Value
	Elements() js.Value
	Encoding() js.Value
	Enctype() js.Value
	Length() js.Value
	Method() js.Value
	Name() js.Value
	Target() js.Value

	ReportValidity() js.Value
	RequestSubmit() js.Value
	Reset() js.Value
	Submit() js.Value
}

// HTMLHRElementWrapper
// <hr>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLHRElement
type HTMLHRElementWrapper interface {
	HTMLElementWrapper
}

// HTMLHeadElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLHeadElement
type HTMLHeadElementWrapper interface {
	HTMLElementWrapper
}

// HTMLHeadingElementWrapper
// <h1>
// <h2>
// <h3>
// <h4>
// <h5>
// <h6>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLHeadingElement
type HTMLHeadingElementWrapper interface {
	HTMLElementWrapper
}

// HTMLHtmlElementWrapper
// <html>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLHtmlElement
type HTMLHtmlElementWrapper interface {
	HTMLElementWrapper
}

// HTMLIFrameElementWrapper
// <iframe>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement
type HTMLIFrameElementWrapper interface {
	HTMLElementWrapper

	Allow() js.Value
	AllowFullscreen() js.Value
	ContentDocument() js.Value
	ContentWindow() js.Value
	Height() js.Value
	Loading() js.Value
	Name() js.Value
	ReferrerPolicy() js.Value
	Sandbox() js.Value
	Src() js.Value
	Srcdoc() js.Value
	Width() js.Value
}

// HTMLImageElementWrapper
// <img>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement
type HTMLImageElementWrapper interface {
	HTMLElementWrapper

	Alt() js.Value
	Complete() js.Value
	CrossOrigin() js.Value
	CurrentSrc() js.Value
	Decoding() js.Value
	FetchPriority() js.Value
	Height() js.Value
	IsMap() js.Value
	Loading() js.Value
	NaturalHeight() js.Value
	NaturalWidth() js.Value
	ReferrerPolicy() js.Value
	Sizes() js.Value
	Src() js.Value
	Srcset() js.Value
	UseMap() js.Value
	Width() js.Value
	X() js.Value
	Y() js.Value

	Decode() js.Value
}

// HTMLInputElementWrapper
// <input>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement
type HTMLInputElementWrapper interface {
	HTMLElementWrapper

	Disabled() js.Value
	Files() js.Value
	Labels() js.Value
	Multiple() js.Value
	PopoverTargetAction() js.Value
	PopoverTargetElement() js.Value
	SelectionDirection() js.Value
	SelectionEnd() js.Value
	SelectionStart() js.Value
	Type() js.Value
	WebkitDirectory() js.Value
	WebkitEntries() js.Value

	CheckValidity() js.Value
	ReportValidity() js.Value
	Select() js.Value
	SetCustomValidity() js.Value
	SetRangeText() js.Value
	SetSelectionRange() js.Value
	ShowPicker() js.Value
	StepDown() js.Value
	StepUp() js.Value
}

// HTMLLIElementWrapper
// <li>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLLIElement
type HTMLLIElementWrapper interface {
	HTMLElementWrapper
}

// HTMLLabelElementWrapper
// <label>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement
type HTMLLabelElementWrapper interface {
	HTMLElementWrapper

	Control() js.Value
	Form() js.Value
	HtmlFor() js.Value
}

// HTMLLegendElementWrapper
// <legend>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLLegendElement
type HTMLLegendElementWrapper interface {
	HTMLElementWrapper
}

// HTMLLinkElementWrapper
// <link>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLLinkElement
type HTMLLinkElementWrapper interface {
	HTMLElementWrapper

	As() js.Value
	CrossOrigin() js.Value
	Disabled() js.Value
	FetchPriority() js.Value
	Hreflang() js.Value
	Integrity() js.Value
	ReferrerPolicy() js.Value
	Rel() js.Value
	RelList() js.Value
	Sheet() js.Value
	Type() js.Value
}

// HTMLMapElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMapElement
type HTMLMapElementWrapper interface {
	HTMLElementWrapper

	Name() js.Value
}

// HTMLMediaElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement
type HTMLMediaElementWrapper interface {
	HTMLElementWrapper

	AudioTracks() js.Value
	Autoplay() js.Value
	Buffered() js.Value
	Controls() js.Value
	ControlsList() js.Value
	CrossOrigin() js.Value
	CurrentSrc() js.Value
	CurrentTime() js.Value
	DefaultMuted() js.Value
	DefaultPlaybackRate() js.Value
	DisableRemotePlayback() js.Value
	Duration() js.Value
	Ended() js.Value
	Error() js.Value
	Loop() js.Value
	MediaKeys() js.Value
	Muted() js.Value
	NetworkState() js.Value
	Paused() js.Value
	PlaybackRate() js.Value
	Preload() js.Value
	PreservesPitch() js.Value
	ReadyState() js.Value
	Remote() js.Value
	Seekable() js.Value
	SinkId() js.Value
	Src() js.Value
	SrcObject() js.Value
	TextTracks() js.Value
	VideoTracks() js.Value
	Volume() js.Value

	CanPlayType() js.Value
	CaptureStream() js.Value
	FastSeek() js.Value
	Load() js.Value
	Pause() js.Value
	Play() js.Value
	SetMediaKeys() js.Value
	SetSinkId() js.Value
}

// MenuElementWrapper
// <menu>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMenuElement
type MenuElementWrapper interface {
	HTMLElementWrapper
}

// HTMLMetaElementWrapper
// <meta>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMetaElement
type HTMLMetaElementWrapper interface {
	HTMLElementWrapper

	Content() js.Value
	HttpEquiv() js.Value
	Media() js.Value
	Name() js.Value
}

// HTMLMeterElementWrapper
// <meter>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement
type HTMLMeterElementWrapper interface {
	HTMLElementWrapper

	Labels() js.Value
}

// HTMLModElementWrapper
// <del>
// <ins>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLModElement
type HTMLModElementWrapper interface {
	HTMLElementWrapper
}

// HTMLOListElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLOListElement
type HTMLOListElementWrapper interface {
	HTMLElementWrapper

	Reversed() js.Value
	Start() js.Value
	Type() js.Value
}

// HTMLObjectElementWrapper
// <object>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLObjectElement
type HTMLObjectElementWrapper interface {
	HTMLElementWrapper

	ContentDocument() js.Value
	ContentWindow() js.Value
	Data() js.Value
	Form() js.Value
	Height() js.Value
	Name() js.Value
	Type() js.Value
	ValidationMessage() js.Value
	Validity() js.Value
	Width() js.Value
	WillValidate() js.Value

	CheckValidity() js.Value
	SetCustomValidity() js.Value
}

// HTMLOptGroupElementWrapper
// <optgroup>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptGroupElement
type HTMLOptGroupElementWrapper interface {
	HTMLElementWrapper
}

// HTMLOptionElementWrapper
// <option>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptionElement
type HTMLOptionElementWrapper interface {
	HTMLElementWrapper
}

// HTMLOptionsCollectionWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptionsCollection
type HTMLOptionsCollectionWrapper interface {
	HTMLCollectionWrapper
}

// HTMLOutputElementWrapper
// <output>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLOutputElement
type HTMLOutputElementWrapper interface {
	HTMLElementWrapper

	Labels() js.Value
}

// HTMLParagraphElementWrapper
// <p>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLParagraphElement
type HTMLParagraphElementWrapper interface {
	HTMLElementWrapper
}

// HTMLPictureElementWrapper
// <picture>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLPictureElement
type HTMLPictureElementWrapper interface {
	HTMLElementWrapper
}

// HTMLPreElementWrapper
// <pre>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLPreElement
type HTMLPreElementWrapper interface {
	HTMLElementWrapper
}

// HTMLProgressElementWrapper
// <progress>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLProgressElement
type HTMLProgressElementWrapper interface {
	HTMLElementWrapper

	Labels() js.Value
	Max() js.Value
	Position() js.Value
	Value() js.Value
}

// HTMLQuoteElementWrapper
// <blockquote>
// <q>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLQuoteElement
type HTMLQuoteElementWrapper interface {
	HTMLElementWrapper
}

// HTMLScriptElementWrapper
// <script>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLScriptElement
type HTMLScriptElementWrapper interface {
	HTMLElementWrapper

	Async() js.Value
	CrossOrigin() js.Value
	Defer() js.Value
	FetchPriority() js.Value
	Integrity() js.Value
	NoModule() js.Value
	ReferrerPolicy() js.Value
	Src() js.Value
	Text() js.Value
	Type() js.Value

	Supports() js.Value
}

// HTMLSelectElementWrapper
// <select>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement
type HTMLSelectElementWrapper interface {
	HTMLElementWrapper

	Disabled() js.Value
	Form() js.Value
	Labels() js.Value
	Options() js.Value
	SelectedIndex() js.Value
	SelectedOptions() js.Value
	Type() js.Value
	Value() js.Value

	Add() js.Value
	CheckValidity() js.Value
	Item() js.Value
	NamedItem() js.Value
	Remove() js.Value
	SetCustomValidity() js.Value
	ShowPicker() js.Value
}

// HTMLSourceElementWrapper
// <source>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLSourceElement
type HTMLSourceElementWrapper interface {
	HTMLElementWrapper

	Height() js.Value
	Width() js.Value
}

// HTMLSpanElementWrapper
// <span>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLSpanElement
type HTMLSpanElementWrapper interface {
	HTMLElementWrapper
}

// HTMLStyleElementWrapper
// <style>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLStyleElement
type HTMLStyleElementWrapper interface {
	HTMLElementWrapper

	Disabled() js.Value
	Media() js.Value
	Sheet() js.Value
}

// HTMLTableCaptionElementWrapper
// <caption>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableCaptionElement
type HTMLTableCaptionElementWrapper interface {
	HTMLElementWrapper
}

// HTMLTableCellElementWrapper
// <td>
// <th>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableCellElement
type HTMLTableCellElementWrapper interface {
	HTMLElementWrapper

	Abbr() js.Value
	CellIndex() js.Value
	ColSpan() js.Value
	Headers() js.Value
	RowSpan() js.Value
	Scope() js.Value
}

// HTMLTableColElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableColElement
type HTMLTableColElementWrapper interface {
	HTMLElementWrapper

	Span() js.Value
}

// HTMLTableElementWrapper
// <table>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableElement
type HTMLTableElementWrapper interface {
	HTMLElementWrapper

	Captions() js.Value
	Rows() js.Value
	TBodies() js.Value
	TFoot() js.Value
	THead() js.Value

	CreateCaption() js.Value
	CreateTBody() js.Value
	CreateTFoot() js.Value
	CreateTHead() js.Value
	DeleteCaption() js.Value
	DeleteRow() js.Value
	DeleteTBody() js.Value
	DeleteTFoot() js.Value
	DeleteTHead() js.Value
	InsertRow() js.Value
}

// HTMLTableRowElementWrapper
// <tr>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableRowElement
type HTMLTableRowElementWrapper interface {
	HTMLElementWrapper

	RowIndex() js.Value
	SelectionRowIndex() js.Value

	DeleteCell() js.Value
	InsertCell() js.Value
}

// HTMLTableSectionElementWrapper
// <thead>
// <tbody>
// <tfoot>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableSectionElement
type HTMLTableSectionElementWrapper interface {
	HTMLElementWrapper

	Rows() js.Value

	DeleteRow() js.Value
	InsertRow() js.Value
}

// HTMLTemplateElementWrapper
// <template>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement
type HTMLTemplateElementWrapper interface {
	HTMLElementWrapper

	Content() js.Value
	ShadowRootClonable() js.Value
	ShadowRootDelegatesFocus() js.Value
	ShadowRootMode() js.Value
}

// HTMLTextAreaElementWrapper
// <textarea>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTextAreaElement
type HTMLTextAreaElementWrapper interface {
	HTMLElementWrapper

	Labels() js.Value
	Type() js.Value

	Select() js.Value
}

// HTMLTimeElementWrapper
// <time>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTimeElement
type HTMLTimeElementWrapper interface {
	HTMLElementWrapper

	DateTime() js.Value
}

// HTMLTitleElementWrapper
// <title>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTitleElement
type HTMLTitleElementWrapper interface {
	HTMLElementWrapper

	Text() js.Value
}

// HTMLTrackElementWrapper
// <track>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLTrackElement
type HTMLTrackElementWrapper interface {
	HTMLElementWrapper

	Src() js.Value

	Cuechange() js.Value
}

// HTMLUListElementWrapper
// <ul>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLUListElement
type HTMLUListElementWrapper interface {
	HTMLElementWrapper
}

// HTMLUnknownElementWrapper
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLUnknownElement
type HTMLUnknownElementWrapper interface {
	HTMLElementWrapper
}

// HTMLVideoElementWrapper
// <video>
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement
type HTMLVideoElementWrapper interface {
	HTMLMediaElementWrapper

	DisablePictureInPicture() js.Value
	Height() js.Value
	Poster() js.Value
	VideoHeight() js.Value
	VideoWidth() js.Value
	Width() js.Value

	CancelVideoFrameCallback() js.Value
	GetVideoPlaybackQuality() js.Value
	RequestPictureInPicture() js.Value
	RequestVideoFrameCallback() js.Value
}
